﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Entidad;
using SegIdenPC.Herramientas;
using log4net;
using GS1.Utilitario;
using System.Drawing.Imaging;
using System.Configuration;

namespace SegIdenPC.Formularios
{
    public partial class frmMantOrdenCompra : Form
    {

        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmMantOrdenCompra));

        private const string TITULO = "Mantenimiento de Ordenes de Compra";
        private const string FORMATO_TOTAL_ENCONTRADOS = "Total productos encontrados: {0}";

        public enum OperacionMantenimiento
        {
            Nuevo,
            Editar
        }

        private OperacionMantenimiento tipoOperacion = OperacionMantenimiento.Nuevo;

        private enum Opcion
        {
            Abrir = 0,
            Nuevo = 1,
            Editar = 2,
            Grabar = 3,
            Atendido = 4,
            Cancelar = 5,
            Generar = 6
        }

        private OrdenCompra ordenCompraActual = null;
        private Cliente clienteSolicitante = null;
        private Tienda tiendaSolicitante = null;
        private Producto producto = null;
        private ListaTienda listaTienda = null;
        private Proveedor proveedorActual = null;
        
        private ListaOrdenCompra listaOrdenCompra = null;
        private const string FORMATO_PRODUCTO_DESCRIPCION_DETALLADA = "{0} - {1} - {2} - {3}";

        #endregion

        #region --- Constructor ---
        public frmMantOrdenCompra()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---


        private void frmMantOrdenCompra_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }
        private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
        {
            if (!e.TabPage.Enabled) { e.Cancel = true; }
        }
   
        private void btnBuscar_Click(object sender, EventArgs e)
        {
            elegirProveedorBusqueda();
        }
        private void tbtnNuevo_Click(object sender, EventArgs e)
        {
            //nuevo();
        }

        private void tbtnGrabar_Click(object sender, EventArgs e)
        {
            //grabar();
        }

        private void tbtnCancelar_Click(object sender, EventArgs e)
        {
            //cancelar();
        }

        private void tbtnAbrir_Click(object sender, EventArgs e)
        {
            abrir();
        }

        private void tbtnEditar_Click(object sender, EventArgs e)
        {
            //editar();
        }

        private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }
        private void btnBuscarProveedor_Click(object sender, EventArgs e)
        {
            //elegirProveedor();
        }

        private void btnBuscarSolicitante_Click(object sender, EventArgs e)
        {
            //elegirSolicitante();
        }

        private void btnBuscarProducto_Click(object sender, EventArgs e)
        {
            //elegirProducto();
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            //agregarProducto();
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            //quitarProducto();
        }
        private void chkVentaDirecta_CheckedChanged(object sender, EventArgs e)
        {
            //cambiarEtiquetaSolicitante();
        }
        private void txtPrecioEW_TextChanged(object sender, EventArgs e)
        {
            //Libreria.SoloNumeros((TextBox)sender, e, true, 2);
        }

        private void txtPrecioIF_TextChanged(object sender, EventArgs e)
        {
            //Libreria.SoloNumeros((TextBox)sender, e, true, 2);
        }
        private void txtCantidad_TextChanged(object sender, EventArgs e)
        {
            //Libreria.SoloNumeros((TextBox)sender, e);
        }
        private void txtProveedorIdentificacion_TextChanged(object sender, EventArgs e)
        {
            //if (e.KeyCode == Keys.Enter) { buscarProveedor(); }
        }
        private void txtProveedorIdentificacion_KeyDown(object sender, EventArgs e)
        {
            limpiarDatosProveedor();
        }

        #endregion

        #region --- Metodos Propios ---

        private string ejecutarOperacionGenerico(Operacion operacion)
        {
            string contenidoXML = string.Empty;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return null;
            }

            return contenidoXML;
        }


        private void cargarMonedas()
        {

            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_MONEDAS;

            contenidoXML = ejecutarOperacionGenerico(operacion);
            if (contenidoXML == null) { return; }

            ListaMoneda listaMoneda = contenidoXML.DeserializarTo<ListaMoneda>();

            // Estableciendo listado de paises
            this.cboMoneda.DataSource = listaMoneda.lista;
            this.cboMoneda.ValueMember = Constantes.GENERAL_CODIGO;
            this.cboMoneda.DisplayMember = Constantes.GENERAL_DESCRIPCION;
            this.cboMoneda.SelectedIndex = 0;
        }
        
        private void cargarFormulario()
        {
            ListaGeneral listaEstado = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Activaciones de botones por rol
                controlBotonesPorRol();
                // Instanciando y creando listado de estado
                listaEstado = new ListaGeneral();
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_PENDIENTE, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PENDIENTE });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_AUTORIZADO, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_AUTORIZADO });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_RECEPCIONADO, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_PARCIAL, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL });
                listaEstado.Add(new General { codigo = Constantes.ESTADO_DOCUMENTO_DESPACHADO, descripcion = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO });

                // Desactivando el grupo de campo de informacion
                this.tabPagDatos.Enabled = false;
                // Estableciendo Ficha 0 como seleccion incial
                this.tabControl.SelectedIndex = 0;
                // Capturando evento selecting en el control Tab
                this.tabControl.Selecting += new TabControlCancelEventHandler(tabControl_Selecting);

                // Estableciendo a 0 el texto del total de registros encontrados.
                this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, 0);

                // Desactivando el boton abrir.
                this.tbtnAbrir.Enabled = false;

                // Estableciendo datos del combo Estado
                this.cboEstado.DataSource = listaEstado;
                this.cboEstado.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboEstado.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboEstado.SelectedIndex = 0;

                cargarMonedas();

                // Estableciendo tienda de destino
                this.tiendaSolicitante = ParametrosAplicacion.TIENDA_ACTUAL;
                this.txtSolicitante.Text = this.tiendaSolicitante.nombre;

                this.txtPrecioIF.Focus();

            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }
        private void controlBotonesPorRol()
        {
            if (ParametrosAplicacion.ROL_ADMINISTRADOR.codigo.Equals(ParametrosAplicacion.USUARIO_ACTUAL.rol.codigo)) { return; }

            this.tbtnNuevo.Visible = false;
            this.tbtnEditar.Visible = false;
            //this.tbtnEliminar.Visible = false;
            this.tbtnGrabar.Visible = false;
        }
        private void elegirProveedorBusqueda()
        {
            using (frmMantProveedor frmMantProveedor = new frmMantProveedor())
            {
                frmMantProveedor.formularioBusqueda = true;
                if (frmMantProveedor.ShowDialog() == DialogResult.Cancel) { return; }

                this.proveedorActual = frmMantProveedor.proveedorActual;
                this.txtProveedorBusqueda.Text = this.proveedorActual.identificacion;
            }

            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_ORDENCOMPRAS;

            // Estableciendo OC a filtrar
            operacion.ordenCompra = new OrdenCompra();
            operacion.ordenCompra.codOC = Constantes.VALOR_CERO;

            operacion.ordenCompra.proveedor = new Proveedor();
            operacion.ordenCompra.proveedor.codProveedor = this.proveedorActual.codProveedor;

            // Estableciendo estado de OC
            //operacion.ordenCompra.estado = Constantes.ESTADO_OC_PENDIENTE;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de la lista de solicitudes pendientes de autorizacion
            this.listaOrdenCompra = contenidoXML.DeserializarTo<ListaOrdenCompra>();

            // Mostrar el total de registros encontrados
            this.lblTotalRegistros.Text = string.Format(FORMATO_TOTAL_ENCONTRADOS, listaOrdenCompra.lista.Count);

            // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
            this.dgvListadoOrdenCompra.AutoGenerateColumns = false;

            // Se establece la fuente de datos de la grilla
            this.dgvListadoOrdenCompra.DataSource = listaOrdenCompra.lista;

            // Activando o desactivando boton Abrir
            this.tbtnAbrir.Enabled = listaOrdenCompra.lista.Count > 0;

            // Colorear grilla deacuerdo a criterios
            pintarGrilla(dgvListadoOrdenCompra);
        }

        private void pintarGrilla(DataGridView grilla)
        {
            ListPersonalizada<OrdenCompra> listaOrdenCompra = null;
            listaOrdenCompra = (ListPersonalizada<OrdenCompra>)grilla.DataSource;

            if (listaOrdenCompra != null)
            {
                for (int i = 0; i < listaOrdenCompra.Count; i++)
                {
                    OrdenCompra ordenCompra = listaOrdenCompra[i];

                    grilla.Rows[i].Cells[0].Value = ordenCompra.codOC;
                    grilla.Rows[i].Cells[1].Value = ordenCompra.usuario.nombresyApellidos;
                    grilla.Rows[i].Cells[2].Value = Convert.ToDateTime(ordenCompra.fechaRegistro).ToString(Constantes.FORMATO_FECHA);
                    grilla.Rows[i].Cells[3].Value = ordenCompra.origen;
                    switch (ordenCompra.estado)
                    {
                        case Constantes.ESTADO_DOCUMENTO_DESPACHADO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_DEVUELTO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DEVUELTO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_IMPRESO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_IMPRESO;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_PARCIAL:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_PENDIENTE:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PENDIENTE;
                                break;
                            }
                        case Constantes.ESTADO_DOCUMENTO_RECEPCIONADO:
                            {
                                grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO;
                                break;
                            }
                    }
                }
            }
        }
        private void abrir()
        {

            // Estableciendo estado de TagPage de Listado y datos
            this.tabPagListado.Enabled = false;
            this.tabPagDatos.Enabled = true;

            // Mostrar la segunda pagina del TabControl
            this.tabControl.SelectedIndex = 1;

            // Estableciendo los estados de los botones
            cambiarEstadoBotones(Opcion.Abrir);

            // Valida si seleccione algun equipos
            if (this.dgvListadoOrdenCompra.CurrentRow != null && this.dgvListadoOrdenCompra.CurrentRow.Index > -1)
            {
                ListPersonalizada<OrdenCompra> listaOrdenCompra = (ListPersonalizada<OrdenCompra>)this.dgvListadoOrdenCompra.DataSource;
                this.ordenCompraActual = obtenerOrdenCompra(listaOrdenCompra[this.dgvListadoOrdenCompra.CurrentRow.Index]);

                this.txtCodigo.Text = ordenCompraActual.codOC.ToString();
                this.txtPrecioIF.Text = ordenCompraActual.precioInternalFreight;
                //this.cboMoneda.SelectedValue = ordenCompraActual.moneda.descripcion; //Obt
                this.txtProveedorIdentificacion.Text = ordenCompraActual.proveedor.identificacion;
                this.txtProveedorRazonSocial.Text = ordenCompraActual.proveedor.razonSocial;
                this.txtProveedorOrigen.Text = ordenCompraActual.origen;
                               
                // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                this.dgvListado.AutoGenerateColumns = false;

                // Se establece fuente de datos
                this.dgvListado.DataSource = ordenCompraActual.listaLineaOrdenCompra.lista == null ?
                                                        new ListPersonalizada<LineaOrdenCompra>() :
                                                        ordenCompraActual.listaLineaOrdenCompra.lista;

                formatearGrilla();

                switch (ordenCompraActual.estado)
                {
                    case Constantes.ESTADO_DOCUMENTO_PENDIENTE:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PENDIENTE;
                        break;
                    case Constantes.ESTADO_DOCUMENTO_AUTORIZADO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_AUTORIZADO;
                        break;
                    case Constantes.ESTADO_DOCUMENTO_DESPACHADO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DESPACHADO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_PARCIAL:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_PARCIAL;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_IMPRESO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_IMPRESO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_DEVUELTO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_DEVUELTO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                    case Constantes.ESTADO_DOCUMENTO_RECEPCIONADO:
                        this.cboEstado.Text = Constantes.ESTADO_DOCUMENTO_DESCRIPCION_RECEPCIONADO;
                        //debe deshabilitar todos los botones y tambien los de consulta
                        cambiarEstadoBotones(Opcion.Atendido);
                        break;
                }

                this.cboEstado.Enabled = false;
                this.cboMoneda.Enabled = false;
                this.txtPrecioIF.Enabled = false;
                this.txtPrecioEW.Enabled = false;
                this.btnAgregar.Enabled = false;
                this.btnEliminar.Enabled = false;
                this.btnBuscarProveedor.Enabled = false;
                this.btnBuscarSolicitante.Enabled = false;
                this.btnBuscarProducto.Enabled = false;
                this.btnVenta.Enabled = false;
                this.chkVentaDirecta.Enabled = false;

                if (ordenCompraActual.origen == "1")
                {
                    Libreria.ShowMessageboxInfo("Esta orden de compra es Nacional, para ver el contenido vaya al menú compra Nacional", TITULO);
                    // Estableciendo estado de TagPage de Listado y datos
                    this.tabPagListado.Enabled = true; this.tabPagDatos.Enabled = false;

                    // Mostrar la primera pagina del TabControl
                    this.tabControl.SelectedIndex = 0;

                    // Deshabilitando el grupoBox de datos
                    this.grpDatos.Enabled = false;

                    // Estableciendo los estados de los botones
                    // cambiarEstadoBotones(Opcion.Cancelar);

                    // Estableciendo focus
                    this.btnBuscar.Focus();

                }
            }
        }
        private void formatearGrilla()
        {
            ListPersonalizada<LineaOrdenCompra> listaLineaOrdenCompra = null;
            listaLineaOrdenCompra = (ListPersonalizada<LineaOrdenCompra>)this.dgvListado.DataSource;

            if (listaLineaOrdenCompra != null)
            {
                for (int i = 0; i < listaLineaOrdenCompra.Count; i++)
                {
                    var lineaOrdenCompra = listaLineaOrdenCompra[i];

                    this.dgvListado.Rows[i].Cells[0].Value = lineaOrdenCompra.producto.codigo;
                    this.dgvListado.Rows[i].Cells[1].Value = lineaOrdenCompra.producto.codProductoProveedor;
                    this.dgvListado.Rows[i].Cells[2].Value = lineaOrdenCompra.producto.descripcion;
                }
            }
        }

        private OrdenCompra obtenerOrdenCompra(OrdenCompra ordenCompra)
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_ORDENCOMPRA;
            operacion.ordenCompra = ordenCompra;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return ordenCompra;
            }

            // Obteniendo Objeto de Producto
            OrdenCompra ordenCompraObtenido = contenidoXML.DeserializarTo<OrdenCompra>();

            return ordenCompraObtenido;

        }
        private void cambiarEstadoBotones(Opcion tipoOpcion)
        {
            switch (tipoOpcion)
            {
                case Opcion.Abrir:
                    this.tbtnEditar.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    break;
                case Opcion.Nuevo:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    break;
                case Opcion.Editar:
                    this.tbtnGrabar.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnNuevo.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    break;
                case Opcion.Grabar:
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnEditar.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnCancelar.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    break;
                case Opcion.Atendido:
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnAbrir.Enabled = false;
                    break;
                case Opcion.Cancelar:
                    this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    this.tbtnCancelar.Enabled = false;
                    break;
                case Opcion.Generar:
                    this.tbtnAbrir.Enabled = true;
                    this.tbtnNuevo.Enabled = true;
                    this.tbtnSalir.Enabled = true;
                    this.tbtnGrabar.Enabled = false;
                    this.tbtnEditar.Enabled = false;
                    break;
            }
        }

        private void salir()
        {
            this.Close();
        }
        private void limpiarDatosProveedor()
        {
            // Limpiando datos del proveedor anterior
            this.txtProveedorRazonSocial.Text = string.Empty;
            this.txtProveedorOrigen.Text = string.Empty;
        }

        #endregion

       

       

       

       
    }
}
